package com.c2b.algorithm.newcoder.hash;

/**
 * <a href="https://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163?tpId=295&tqId=745&ru=%2Fpractice%2Fc215ba61c8b1443b996351df929dc4d4&qru=%2Fta%2Fformat-top101%2Fquestion-ranking&sourceUrl=%2Fexam%2Foj">数组中出现次数超过一半的数字</a>
 * <p>
 * 给一个长度为 n 的数组，数组中有一个数字出现的次数超过数组长度的一半，请找出这个数字。<br>
 * 例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次，超过数组长度的一半，因此输出2。<br>
 * </p>
 * <p>
 * 数据范围：n≤50000，数组中元素的值0≤val≤10000<br>
 * 要求：空间复杂度：O(1)，时间复杂度O(n)<br>
 * 输入描述：保证数组输入非空，且保证有解
 * </p>
 *
 * @author c2b
 * @since 2023/3/14 16:23
 */
public class BM0051MoreThanHalfNum_S {

    public int MoreThanHalfNum_Solution(int[] array) {
        // 保证数组输入非空，且保证有解。不需要做健壮性校验
        int res = array[0];
        int times = 0;
        for (int val : array) {
            if (times == 0) {
                res = val;
                times = 1;
            } else {
                times = val == res ? times + 1 : times - 1;
            }
        }
        return res;
    }

    public static void main(String[] args) {
        BM0051MoreThanHalfNum_S bm0051MoreThanHalfNum_s = new BM0051MoreThanHalfNum_S();
        System.out.println(bm0051MoreThanHalfNum_s.MoreThanHalfNum_Solution(new int[]{3, 3, 3, 3, 2, 2, 2}));
    }
}